/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function (nums) {
  // 如果数组为空，直接返回0
  if (nums.length === 0) return 0;

  let n = nums.length;
  let dp = Array.from({ length: n }, () => new Array(2).fill(0));

  dp[0][0] = nums[0]; // 选第一个房子
  dp[0][1] = 0; // 不选第一个房子

  // 每个索引都有两个状态：抢 or 不抢
  for (let i = 1; i < nums.length; i++) {
    dp[i][0] = dp[i - 1][1] + nums[i]; // 选当前房子，前一个房子必须不选
    dp[i][1] = Math.max(dp[i - 1][0], dp[i - 1][1]); // 不选当前房子，前一个房子可选可不选
  }

  // 输出结果
  return Math.max(dp[n - 1][0], dp[n - 1][1]);
};

console.log(rob([2, 7, 9, 3, 1])); // 期望输出12